﻿using Microsoft.EntityFrameworkCore;
using Microsoft.EntityFrameworkCore.Metadata.Builders;
using wwl.Domain.Entities.Rbac;

namespace wwl.DataAccess.Mappings.Rbac
{
  /// <summary>
  /// 租户实体（Tenant）与数据库表的映射配置
  /// 实现EF Core的IEntityTypeConfiguration接口，集中管理实体的数据库映射规则
  /// 职责：定义实体属性与表字段的映射关系、约束、索引等，使领域实体与数据库表结构解耦
  /// </summary>
  public class TenantMap : IEntityTypeConfiguration<Tenant>
  {
    /// <summary>
    /// 配置租户实体的数据库映射细节
    /// </summary>
    /// <param name="builder">实体类型构建器，用于配置实体的映射规则</param>
    public void Configure(EntityTypeBuilder<Tenant> builder)
    {
      // 指定实体对应的数据库表名：rbac_tenant（rbac模块的租户表）
      builder.ToTable("rbac_tenant");

      // 配置主键：映射到实体的Id属性
      builder.HasKey(x => x.Id);

      #region 实体属性与表字段的映射配置
      // 配置Id属性：对应表中id字段，长度64，非空
      builder.Property(x => x.Id)
          .HasColumnName("id")          // 数据库字段名
          .HasMaxLength(64)             // 最大长度限制
          .IsRequired();                // 非空约束

      // 配置TenantCode属性：对应表中tenant_code字段，长度64，非空（租户编码唯一标识）
      builder.Property(x => x.TenantCode)
          .HasColumnName("tenant_code")
          .HasMaxLength(64)
          .IsRequired();

      // 配置TenantName属性：对应表中tenant_name字段，长度128，非空（租户名称）
      builder.Property(x => x.TenantName)
          .HasColumnName("tenant_name")
          .HasMaxLength(128)
          .IsRequired();

      // 配置Status属性：对应表中status字段，存储为字符串，长度20，非空（租户状态）
      builder.Property(x => x.Status)
          .HasColumnName("status")
          .HasConversion<string>()      // 将枚举类型转换为字符串存储（如"ENABLED"）
          .HasMaxLength(20)
          .IsRequired();

      // 配置CreatedTime属性：对应表中created_time字段，非空（创建时间）
      builder.Property(x => x.CreatedTime)
          .HasColumnName("created_time")
          .IsRequired();

      // 配置UpdatedTime属性：对应表中updated_time字段，非空（更新时间）
      builder.Property(x => x.UpdatedTime)
          .HasColumnName("updated_time")
          .IsRequired();

      // 配置CreatedBy属性：对应表中created_by字段，长度64，非空（创建人ID）
      builder.Property(x => x.CreatedBy)
          .HasColumnName("created_by")
          .HasMaxLength(64)
          .IsRequired();

      // 配置Remarks属性：对应表中remarks字段，类型为text（长文本备注）
      builder.Property(x => x.Remarks)
          .HasColumnName("remarks")
          .HasColumnType("text");       // 数据库字段类型为text（支持长文本）

      // 配置IsDeleted属性：对应表中is_deleted字段，默认值false（逻辑删除标记）
      builder.Property(x => x.IsDeleted)
          .HasColumnName("is_deleted")
          .HasDefaultValue(false);      // 默认为未删除
      #endregion

      #region 索引与约束配置
      // 为TenantCode创建唯一索引：确保租户编码在数据库中唯一，防止重复
      builder.HasIndex(x => x.TenantCode)
          .IsUnique()                  // 唯一索引
          .HasDatabaseName("ix_rbac_tenant_tenant_code");  // 索引名称（规范：ix_表名_字段名）

      // 为表添加检查约束：限制Status字段只能是'ENABLED'或'DISABLED'
      builder.ToTable(tableBuilder =>
      {
        tableBuilder.HasCheckConstraint(
            "ck_tenant_status",        // 约束名称（规范：ck_表名_字段名）
            "Status IN ('ENABLED', 'DISABLED')"  // 约束条件：状态只能是两个枚举值
        );
      });
      #endregion
    }
  }
}